package com.sojson.service;

import java.io.IOException;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import com.sojson.entity.bo.AuthcUser;
import com.sojson.entity.bo.Select;
import com.sojson.entity.po.Member;
import com.sojson.entity.vo.MemberVo;
import com.sojson.util.token.Token;
import com.sojson.util.token.TokenVo;
import com.sojson.util.token.interfaces.UserService;

/**
 * 用户表Service
 * 
 * @author liu
 * @date 2021-03-16
 */
public interface MemberService extends UserService {

    /**
     * 单条插入
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int insert(Member member);

    /**
     * 批量插入
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int insertList(Member member);

    /**
     * 通过对象批量删除(物理删除)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int deleteByDto(Member member);

    /**
     * 统计全部数量
     * 
     * @return
     * @throws SQLException
     */
    int countAll();

    /**
     * 查询所有
     * 
     * @return
     * @throws SQLException
     */
    List<Member> findAll();

    /**
     * 根据对象统计数量
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int countByDto(Member member);

    /**
     * 根据对象查询
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    List<Member> findByDto(Member member);

    /**
     * 通过id删除(物理删除)
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    int deleteById(Integer id);

    /**
     * 通过id列表删除(物理删除)
     * 
     * @param ids
     * @return
     * @throws SQLException
     */
    int deleteByIdList(ArrayList<Integer> ids);

    /**
     * 通过id更新(全部更新)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateById(Member member);

    /**
     * 通过id列表更新(全部更新)(更新内容相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateStaticByIdList(Member member);

    /**
     * 通过id列表更新(全部更新)(更新内容不相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateChangeByIdList(Member member);

    /**
     * 通过id更新(局部更新)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updatePartialById(Member member);

    /**
     * 通过id列表更新(局部更新)(更新内容相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateStaticPartialByIdList(Member member);

    /**
     * 通过id列表更新(局部更新)(更新内容不相同)
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    int updateChangePartialByIdList(Member member);

    /**
     * 通过id查询
     * 
     * @param id
     * @return
     */
    @Override
    Member findById(Integer id);

    /**
     * 通过编号查询
     * 
     * @param no
     * @return
     */
    Member findByNo(String no);

    /**
     * 通过id列表查询
     * 
     * @param ids
     * @return
     * @throws SQLException
     */
    ArrayList<Member> findByIdList(ArrayList<Integer> ids);

    /**
     * 通过对象查询id列表
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    ArrayList<Integer> findIdByDto(Member member);

    /**
     * 清空数据(物理清空)
     * 
     * @throws SQLException
     */
    void clear();

    /**
     * 通过手机号查询
     * 
     * @param mobile
     * @return
     */
    Member findByMobile(String mobile);

    /**
     * 通过手机号查询
     * 
     * @param roles     角色列表
     * @param mobile    
     * @return
     */
    Member findByRoleMobile(Set<String> roles, String mobile);

    /**
     * 通过id更新手机号
     * 
     * @param token
     * @return
     * @throws IOException 
     */
    int updateMobileById(TokenVo token) throws IOException;

    /**
     * 通过id验证旧密码修改密码
     * 
     * @param member
     * @return
     * @throws Exception 
     */
    int updatePwdByOldPwd(AuthcUser member) throws Exception;

    /**
     * 通过id验证短信修改密码
     * 
     * @param token
     * @return
     * @throws Exception 
     */
    int updatePwdBySms(Token token) throws Exception;

    /**
     * 通过id修改状态
     * 
     * @param member
     * @return
     * @throws IOException 
     */
    int updateStatusById(Member member) throws IOException;

    /**
     * 通过帐号查询
     * 
     * @param username
     * @return
     */
    Member findByUsername(String username);

    /**
     * 通过角色和帐号查询
     * 
     * @param roles     角色列表
     * @param username  帐号
     * @return
     */
    Member findByRoleUsername(Set<String> roles, String username);

    /**
     * 通过微信唯一标识查询
     * 
     * @param wxUnionid
     * @return
     */
    Member findByWxUnionid(String wxUnionid);

    /**
     * 通过微信唯一标识查询
     * 
     * @param roles     角色列表
     * @param wxUnionid 微信唯一编号
     * @return
     */
    Member findByRoleWxUnionid(Set<String> roles, String wxUnionid);

    /**
     * 通过微信openid查询
     * 
     * @param roles     角色列表
     * @param openid
     * @return
     */
    Member findByRoleOpenid(Set<String> roles, String openid);

    /**
     * 修改支付密码
     * 
     * @param mem
     * @return
     */
    int updatePayPwd(AuthcUser mem);

    /**
     * 获取当前佣金信息
     * 
     * @param id
     * @return
     */
    Member findBalance(Integer id);

    /**
     * 获取当前余额信息
     * 
     * @param id
     * @return
     */
    Member findBrokerage(Integer userId);

    /**
     * 获取下级用户列表
     * 
     * @param member
     * @return
     */
    List<Member> findUnderlingByDto(Member member);

    /**
     * 获取简历
     * 
     * @param id
     * @return
     */
    MemberVo findResume(Integer id);

    /**
     * 获取简历
     * 
     * @param member
     * @return
     */
    List<MemberVo> findResumeList(Member member);

    /**
     * 获取用户的当前诚意金信息
     * 
     * @param userId
     * @return
     */
    MemberVo findDeposit(Integer userId);

    /**
     * 根据对象查询
     * 
     * @param member
     * @return
     * @throws SQLException
     */
    List<MemberVo> list(Member member);

    /**
     * 根据ID查询
     * 
     * @param id
     * @return
     * @throws SQLException
     */
    MemberVo getInfo(Integer id);

    /**
     * 将佣金转入余额
     * 
     * @param balanceLog
     * @return
     * @throws IOException 
     */
    int balanceToBrokerage(BigDecimal total) throws IOException;

    /**
     * 通过订单ID查询
     * 
     * @return
     */
    Member findMerchantByOrderId(Integer goodsId);

    /**
     * 获取商户列表
     * 
     * @param member
     * @return
     */
    List<MemberVo> listByRole(MemberVo member);

    /**
     * 根据对象查询
     * 
     * @param member
     * @return
     */
    List<MemberVo> listUser(MemberVo member);

    /**
     * 获取下拉列表
     * 
     * @param member
     * @return
     */
    List<Select> select(MemberVo member);

    /**
     * 获取商家下拉列表
     * 
     * @param member
     * @return
     */
    List<Select> selectMerchant(MemberVo member);

    /**
     * 用户续租
     * 
     * @param member
     * @return
     * @throws IOException 
     */
    int addDayGoOn(MemberVo mem);

    /**
     * 审核认证信息
     * 
     * @param member
     * @return
     */
    int auditAuth(Member mem);

}